package utna.frba.ia.running;

import org.jgap.InvalidConfigurationException;

import utna.frba.ia.tp.cases.descifrador.DescifradorDeClaveCase;
import utna.frba.ia.tp.cases.descifrador.reglas.impl.Regla15;
import utna.frba.ia.tp.cases.descifrador.reglas.impl.Regla18;
import utna.frba.ia.tp.cases.descifrador.reglas.impl.Regla5;
import utna.frba.ia.tp.cases.descifrador.reglas.impl.ReglaAdicional;

public class Runner {

	public static void main(String[] args) throws InvalidConfigurationException {
		if(args.length < 2) {
			System.out.print("Se debe especificar 2 parametros: " +
					"1ro, la cantidad de evoluciones permitidas, 2do, la cantidad de individuos permitidos");
			return;
		}
		else if(args[0].equals("testearuncromosoma")){
			if(args.length < 2) {
				System.out.print("Se debe especificar una cadena a evaluar");
				return;
			}
			evaluarDetalladamenteUnCromosoma(args[1]);
			return;
		}
		else{
			ExecutionCase ecase = createExecutionCase(Integer.parseInt(args[0]),Integer.parseInt(args[1]));
			ecase.run();
		}
	}

	private static void evaluarDetalladamenteUnCromosoma(String str) {
		Regla5 reg5 = new Regla5();
		Regla15 reg15 = new Regla15();
		Regla18 reg18 = new Regla18();
		ReglaAdicional regAdd = new ReglaAdicional();
		int sumatoriaDeValores = 0;
		
		System.out.println("**************************************************************************************************");
		System.out.println("Se aplica la funcion de aptitud al cromosoma \"" + str + "\"");
		System.out.println("");
		System.out.println("* Aplicando la regla 5: "+reg5.getLiteralDefinition());
		System.out.println("");
		System.out.println("* Aplicando la regla 15: "+reg15.getLiteralDefinition());
		System.out.println("");
		
		for (String detalle : reg15.detalleDelPuntajePorNumerosContenidos(str)) {
			System.out.println("  -> " + detalle);
		}
		System.out.println("");
		sumatoriaDeValores += reg15.valueOf(str);
		System.out.println("Se obtiene un valor de "+reg15.valueOf(str)+" para la regla 15");
		System.out.println("");
		System.out.println("* Aplicando la regla 18: "+reg18.getLiteralDefinition());
		System.out.println("");
		System.out.println("  -> " + reg18.detalleOfValueOf(str));
		System.out.println("");
		sumatoriaDeValores += reg18.valueOf(str);
		System.out.println("Se obtiene un valor de "+reg18.valueOf(str)+" para la regla 18");
		System.out.println("");
		System.out.println("* Aplicando la regla Adicional: "+regAdd.getLiteralDefinition());
		System.out.println("");
		System.out.println("  -> " + regAdd.detalleOfValueOf(str));
		System.out.println("");
		sumatoriaDeValores += regAdd.valueOf(str);
		System.out.println("Se obtiene un valor de "+regAdd.valueOf(str)+" para la regla adicional");
		System.out.println("");
		System.out.println("");
		System.out.println("Valor total de aptitud del cromosoma: "+sumatoriaDeValores);
		System.out.println("Fin de la evaluacion");
		System.out.println("**************************************************************************************************");
	}

	private static ExecutionCase createExecutionCase(int evolutionsAllowed, int amountToPopulate) {
		return new DescifradorDeClaveCase(evolutionsAllowed,amountToPopulate);
	}
	
}
